#include "widget.h"
#include "./ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 1. 设置窗口名字
    this->setWindowTitle("客⼾端");
    // 2. 实例化 socket
    udpsocket = new QUdpSocket(this);
    connect(udpsocket, &QUdpSocket::readyRead, this, [=]() {
        const QNetworkDatagram responseDatagram = udpsocket->receiveDatagram();
        QString response = responseDatagram.data();
        ui->listWidget->addItem(QString("服务器说: ") + response);
    });
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    // 1. 获取输入框内容（移除不必要的const引用）
    QString text = ui->lineEdit->text().trimmed();  // 添加trimmed()去除首尾空格
    if (text.isEmpty()) {
        qDebug() << "输入内容为空";
        return;
    }

    // 2. 构造请求数据报（增加有效性检查）
    QHostAddress serverAddress(SERVER_IP);
    if (serverAddress.isNull()) {
        qDebug() << "无效的服务器IP:" << SERVER_IP;
        return;
    }

    QNetworkDatagram requestDatagram;
    requestDatagram.setData(text.toUtf8());
    requestDatagram.setDestination(serverAddress, SERVER_PORT);

    // 3. 发送请求（增加错误处理）
    qint64 bytesSent = udpsocket->writeDatagram(requestDatagram);
    if (bytesSent == -1) {
        qDebug() << "发送失败:" << udpsocket->errorString();
        ui->listWidget->addItem("[错误] 发送失败: " + udpsocket->errorString());
        return;
    }

    // 4. 添加到消息列表（线程安全方式）
    QString displayText = QString("客户端[%1:%2]说: %3")
                              .arg(udpsocket->localAddress().toString())
                              .arg(udpsocket->localPort())
                              .arg(text);

    // 使用invokeMethod保证线程安全
    QMetaObject::invokeMethod(ui->listWidget, [this, displayText]() {
        ui->listWidget->addItem(displayText);
        ui->listWidget->scrollToBottom();  // 自动滚动到底部
    });

    // 5. 清空输入框（带焦点设置）
    ui->lineEdit->clear();
    ui->lineEdit->setFocus();  // 清空后自动获得焦点
}

